package study.top.jsp;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;

import org.apache.log4j.Logger;

import study.top.common.PatternChecker;

public class WebHandler {

	// Logger 클래스의 인스턴스를 받아온다.
	static Logger logger = Logger.getLogger(WebHandler.class);

	// JSP 내장객체의 참조 선언
	HttpServletRequest request = null;
	HttpServletResponse response = null;
	JspWriter out = null;
	String encType = null;
	
	/*private static WebHandler current = null;
	
	public static WebHandler getInstance(HttpServletRequest request, JspWriter out) {
		return getInstance(request, null, out, "utf-8");
	}
	
	public static WebHandler getInstance(HttpServletRequest request, HttpServletResponse response, JspWriter out) {
		return getInstance(request, response, out, "utf-8");
	}
	
	public static WebHandler getInstance(HttpServletRequest request, HttpServletResponse response,
			JspWriter out, String encType) {
		if (current == null) {
			current = new WebHandler(request, response, out, encType);
		}
		
		logger.info("\n");
		logger.info("----------------- JSP Page Start ----------------");

		// 현재 페이지의 URL 얻기
		String url = request.getRequestURL().toString();
		if (request.getQueryString() != null)
			url = url + "?" + request.getQueryString();

		// 사용자의 IP주소
		String ip = request.getHeader("HTTP_X_FORWARDED_FOR");
		   
	    if(ip == null || ip.length() == 0 || ip.toLowerCase().equals("unknown"))
	        ip = request.getHeader("REMOTE_ADDR");
	   
	    if(ip == null || ip.length() == 0 || ip.toLowerCase().equals("unknown"))
	        ip = request.getRemoteAddr();

		logger.info("[Page URL] " + url);
		logger.info("[Client IP] " + ip);
		
		logger.info("----------------- JSP Page Execute ----------------");
		
		return current;
	}*/


	/**
	 * 생성자 재정의 - 주요 객체 연결
	 */
	public WebHandler(HttpServletRequest request, JspWriter out) {
		this(request, null, out, "utf-8");
	}

	/**
	 * 생성자 재정의 - 주요 객체 연결 + 파라미터의 인코딩 지정
	 */
	public WebHandler(HttpServletRequest request, JspWriter out, String encType) {
		this(request, null, out, encType);
	}

	/**
	 * 생성자 재정의 - 주요 객체 연결 + 파라미터의 인코딩 지정
	 */
	public WebHandler(HttpServletRequest request, HttpServletResponse response,
			JspWriter out, String encType) {
		logger.info("\n");
		logger.info("----------------- JSP Page Start ----------------");

		// 현재 페이지의 URL 얻기
		String url = request.getRequestURL().toString();
		if (request.getQueryString() != null)
			url = url + "?" + request.getQueryString();

		// 사용자의 IP주소
		String ip = request.getHeader("HTTP_X_FORWARDED_FOR");
		   
	    if(ip == null || ip.length() == 0 || ip.toLowerCase().equals("unknown"))
	        ip = request.getHeader("REMOTE_ADDR");
	   
	    if(ip == null || ip.length() == 0 || ip.toLowerCase().equals("unknown"))
	        ip = request.getRemoteAddr();

		logger.info("[Page URL] " + url);
		logger.info("[Client IP] " + ip);
		
		logger.info("----------------- JSP Page Execute ----------------");
		
		this.request = request;
		this.response = response;
		this.out = out;
		this.encType = encType;

		try {
			this.request.setCharacterEncoding(this.encType);
		} catch (UnsupportedEncodingException e) {
			logger.error(e.getLocalizedMessage());
			logger.error(e.getStackTrace());
		}
	}

	/**
	 * 파라미터 받기 - null을 신경쓰지 않아도 되도록 기능 보완 1) 파라미터를 받는다. 2) null일 경우 공백으로 강제 변경
	 * 3) null이 아닐경우 trim() 수행하여 앞/뒤 공백 제거
	 */
	public String getValue(String key) {
		String value = this.request.getParameter(key);

		if (value == null) {
			value = "";
		}

		value = value.trim();

		if (!value.equals("")) {
			try {
				value = new String(value.getBytes("ISO-8859-1"), this.encType);
			} catch (UnsupportedEncodingException e) {
				logger.error(e.getLocalizedMessage());
				logger.error(e.getStackTrace());
			}
		}

		return value;
	}
	
	public String getreValue(String key) {
		String value = this.request.getParameter(key);

		if (value == null) {
			value = "";
		}

		value = value.trim();
/*
		if (!value.equals("")) {
			try {
				value = new String(value.getBytes("ISO-8859-1"), this.encType);
			} catch (UnsupportedEncodingException e) {
				logger.error(e.getLocalizedMessage());
				logger.error(e.getStackTrace());
			}
		}*/

		return value;
	}

	/**
	 * 파라미터를 숫자로 받기 - 변환이 불가능한 형태일 경우 "-1"
	 */
	public int getInt(String key) {
		int value = -1;
		String param = this.getValue(key);

		// 파라미터가 숫자 형태인지 검사
		if (PatternChecker.getInstance().isValue(param)) {
			if (PatternChecker.getInstance().isNum(param)) {
				value = Integer.parseInt(param);
			}
		}

		return value;
	}

	/**
	 * String.format 을 지원하는 출력문
	 */
	public void print(String str, Object... objects) {
		try {
			this.out.println(String.format(str, objects));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 내용 출력 후, <br />
	 * 태그 자동 출력
	 */
	public void printbr(String str, Object... tmpl) {
		this.print(String.format(str + "<br />", tmpl));
	}

	/**
	 * 메시지 박스 출력 후, 페이지 이동
	 * 
	 * @param url
	 *            : 이동할 페이지 - null일 경우 뒤로 이동
	 * @param msg
	 *            : 사용자에게 보여질 메시지 - null일 경우 보이지 않음
	 */
	public void goPage(String url, String msg) {
		String script = "<script type='text/javascript'>";

		if (msg != null) {
			script += "alert('" + msg + "');";
		}

		if (url == null) {
			script += "history.back();";
		}

		script += "</script>";

		// url이 있을 경우 페이지 강제이동
		if (url != null) {
			script += "<meta http-equiv='refresh' content='0;url=" + url + "'>";
		}

		try {
			this.out.print(script);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void openPopup(String popupUrl, String targetUrl, String msg, int width, int height) {
		String script = "<script type='text/javascript'>";
		try {
			script += "window.open('" + popupUrl + "?target=" + URLEncoder.encode(targetUrl, "utf-8") + "&msg=" + URLEncoder.encode(msg, "utf-8") + "', '', 'width=" + width + ",height=" + height + ",scrollbars=no');";
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		script += "</script>";
		
		try {
			this.out.println(script);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void openPopup(String popupUrl, String targetUrl, String msg) {
		this.openPopup(popupUrl, targetUrl, msg, 250, 250);
	}
	
}
